package org.patterns.creational.singleton;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;


/**
 * LazyLoadBalancer类用于实现一个简单的负载均衡器
 * 它使用单例模式确保在系统中只有一个实例，并维护一个服务器列表
 * 提供了添加、移除服务器以及随机选择服务器的功能
 */
public class LazyLoadBalancer {
    //私有静态成员变量，存储唯一实例
    private static volatile LazyLoadBalancer instance = null;
    //服务器集合
    private List<String> serverList = null;

    //私有构造函数，防止外部实例化
    private LazyLoadBalancer() {
        serverList = new ArrayList<String>();
    }


    /**
     * 获取负载均衡器的单例实例
     * 该方法实现了一个简单的单例模式，确保在整个应用程序中只有一个负载均衡器实例
     * 使用了双重检查锁定（Double-Checked Locking）来实现线程安全的延迟初始化
     *
     * @return LoadBalancer实例，如果尚未创建，则在首次调用时创建
     */
    public static LazyLoadBalancer getLoadBalancer() {
        // 检查实例是否已经创建，以避免不必要的同步开销
        if (instance == null) {
            // 同步代码块，确保在多线程环境下安全地创建实例
            synchronized (LazyLoadBalancer.class) {
                // 再次检查实例是否已经创建，以处理多线程环境下的并发情况
                if (instance == null) {
                    instance = new LazyLoadBalancer();
                }
            }
        }
        // 返回负载均衡器的实例
        return instance;
    }


    /**
     * 向服务器列表中添加服务器
     *
     * @param server 要添加的服务器地址或名称
     */
    public void addServer(String server) {
        serverList.add(server);
    }

    /**
     * 从服务器列表中移除服务器
     *
     * @param server 要移除的服务器地址或名称
     */
    public void removeServer(String server) {
        serverList.remove(server);
    }

    /**
     * 随机选择一个服务器
     * 使用Java的Random类来生成一个随机数，以此来选择服务器列表中的一个服务器
     *
     * @return 随机选中的服务器名称
     */
    public String getServer() {
        Random random = new Random();
        int i = random.nextInt(serverList.size());
        return serverList.get(i);
    }
}
